package cn.momoky.ccool.util;

import cn.momoky.ccool.exception.GlobalException;
import com.alibaba.cloud.commons.lang.StringUtils;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * @Description: token  jwt加密方式工具包
 * @Author:keaisuosuo
 * @date: 2021.07.30
 */
public class JwtUtil {

    public static final long EXPIRE = 1000 * 60 * 60 * 2;// token的有效时常
    public static final String SECRET_KEY = "ChoumaomaoSuosuo";// 秘钥

    /**
     * @Description 生成token字符串
     * @Date 7/30/2021 11:03 AM
     * @param id
     * @param name
     *@return java.lang.String
     *@Author keaisuosuo
     **/
    public static String getJwtToken(String id, String name, String ip , String mac, String roleId){

        return Jwts.builder()
                // 1、设置头信息
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                // 2、设置过期时间
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 3、设置token 主体部分（用户信息）
                .claim("id", id)
                .claim("name", name)
                .claim("ip", ip)
                .claim("mac", mac)
                .claim("roleId", roleId)
                // 4、防伪标识，秘钥（和上面常量不是同一个）
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }


    /**
     * @Description 判断token字符串是否有效
     * @Date 7/30/2021 11:21 AM
     * @param jwtToken
     *@return boolean
     *@Author keaisuosuo
     **/
    public static boolean checkToken(String jwtToken) {
        if(StringUtils.isEmpty(jwtToken)) return false;
        try {
            // 判读是否为同一个秘钥
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * @Description 获取用户名
     * @Date 7/30/2021 11:26 AM
     * @param jwtToken
     *@return java.lang.String
     *@Author keaisuosuo
     **/
    public static String getUserName(String jwtToken) throws Exception {
        if(StringUtils.isEmpty(jwtToken)) throw new GlobalException("用户状态错误，错误代码900");
        return (String) Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken).getBody().get("name");
    }

    /**
     * @Description 获取用户id
     * @Date 7/30/2021 11:27 AM
     * @param jwtToken
     *@return java.lang.String
     *@Author keaisuosuo
     **/
    public static String getUserId(String jwtToken) throws Exception {
        if(StringUtils.isEmpty(jwtToken)) throw new GlobalException("用户状态错误，错误代码900");
        return (String) Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken).getBody().get("id");
    }

    public static String getIP(String jwtToken) throws Exception {
        if(StringUtils.isEmpty(jwtToken)) throw new GlobalException("用户状态错误，错误代码900");
        return (String) Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken).getBody().get("ip");
    }

    public static String getMAC(String jwtToken) throws Exception {
        if(StringUtils.isEmpty(jwtToken)) throw new GlobalException("用户状态错误，错误代码900");
        return (String) Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken).getBody().get("mac");
    }

    public static String getRoleId(String jwtToken) throws Exception {
        if(StringUtils.isEmpty(jwtToken)) throw new GlobalException("用户状态错误，错误代码900");
        return (String) Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwtToken).getBody().get("roleId");
    }


}
